package juc.completablefuture.methods.parallel;

/**
 * @ClassName AnyOfAllOfExample
 * @PackageName completablefuture.methods.parallel
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/27 下午5:26
 * @Version 1.0
 */

import java.util.concurrent.CompletableFuture;

/**
 * anyOf()：当多个 CompletableFuture 中任何一个完成时，返回一个新的 CompletableFuture，其结果是最快完成的那个任务的结果。
 * allOf()：当所有给定的 CompletableFuture 都完成时，返回一个新的 CompletableFuture，但这个新的 CompletableFuture 没有具体的返回值，主要用于等待所有任务完成
 *
 */
public class AnyOfAllOfExample {
    public static void main(String[] args) {
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Task 1";
        });

        CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Task 2";
        });

        // anyOf 示例
        CompletableFuture<Object> anyOfCF = CompletableFuture.anyOf(cf1, cf2);
        anyOfCF.thenAccept(System.out::println); // 输出: Task 2

        // allOf 示例
        CompletableFuture<Void> allOfCF = CompletableFuture.allOf(cf1, cf2);
        allOfCF.thenRun(() -> System.out.println("All tasks completed"));

        // 等待足够时间让异步任务完成
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}